"""
# __call__ 内置方法
class Foo:
    def __call__(self, *args, **kwargs):
        print(self)
        print(args)
        print(kwargs)


obj = Foo()

# obj()  # 调用Foo.__call__()绑定方法
obj(1, 2, 3, a=1, b=2, c=3)  # 相当于obj.__call__(obj, 1, 2, 3, a=1, b=2, c=3)

"""


# 元类内部也有一个__call__方法

class MyMeta(type):  # 1. 继承type
    def __init__(self, class_name, class_base, class_dic):
        # 判断类名的首字母是否大写
        if not class_name.istitle():
            raise TypeError('类名的首字母必须大写')

        # __doc__ 类的注释检查
        if '__doc__' not in class_dic or not class_dic['__doc__'].stript():
            raise TypeError('必须有注释， 且注释不能为空')

        # 调用父类
        super(MyMeta, self).__init__(class_name, class_base, class_dic)

    # __call__ 内置方法控制类对象的创建行为
    def __call__(self, *args, **kwargs):
        # print("=====>")
        # print(self)  # Chinese
        # print(args)  # args = ('suomier',)
        # print(kwargs)  # kwargs={'age', 23}

        # 1.创建一个空对象obj
        obj = object.__new__(self)
        # 2.初始化对象obj
        self.__init__(obj, *args, **kwargs)
        # 3.返回对象obj
        return obj


class Chinese(object, metaclass=MyMeta):  # 2. 继承时，设置metaclass参数
    country = 'China'

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def talk(self):
        print("%s is talking" % self.name)


obj = Chinese('suomier', age=23)  # 本质: MyMeta.__call__(Chinese, 'suomier', age=23)
